From a986938bfb27ae90cd4484faa5859df0c0ddf44f Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 7 Aug 2014 08:42:16 -0700 Subject: [PATCH] Make sure version env vars are always present They were accidentally left out of the `rustdoc --test` stage which caused crates not to be able to be compiled. --- src/cargo/ops/cargo_rustc/compilation.rs | 13 +++++++++-- src/cargo/ops/cargo_rustc/context.rs | 28 ++++++++++++++++++++++- src/cargo/ops/cargo_rustc/mod.rs | 29 ++++-------------------- src/snapshots.txt | 7 ++++++ tests/test_cargo_compile.rs | 28 ++++++++++++++--------- 5 files changed, 67 insertions(+), 38 deletions(-) diff --git a/src/cargo/ops/cargo_rustc/compilation.rs b/src/cargo/ops/cargo_rustc/compilation.rs index 4af3050cb..6a1a740bb 100644 --- a/src/cargo/ops/cargo_rustc/compilation.rs +++ b/src/cargo/ops/cargo_rustc/compilation.rs @@ -30,6 +30,10 @@ pub struct Compilation { /// Output directory for rust dependencies pub deps_output: Path, + + /// Extra environment variables that were passed to compilations and should + /// be passed to future invocations of programs. + pub extra_env: HashMap>, } impl Compilation { @@ -41,6 +45,7 @@ impl Compilation { deps_output: Path::new("/"), tests: Vec::new(), binaries: Vec::new(), + extra_env: HashMap::new(), } } @@ -54,7 +59,11 @@ impl Compilation { search_path.push(self.root_output.clone()); search_path.push(self.deps_output.clone()); let search_path = os::join_paths(search_path.as_slice()).unwrap(); - util::process(cmd).env(DynamicLibrary::envvar(), - Some(search_path.as_slice())) + let mut cmd = util::process(cmd).env(DynamicLibrary::envvar(), + Some(search_path.as_slice())); + for (k, v) in self.extra_env.iter() { + cmd = cmd.env(k.as_slice(), v.as_ref().map(|s| s.as_slice())); + } + return cmd; } } diff --git a/src/cargo/ops/cargo_rustc/context.rs b/src/cargo/ops/cargo_rustc/context.rs index 56d969fd2..5f90d92d4 100644 --- a/src/cargo/ops/cargo_rustc/context.rs +++ b/src/cargo/ops/cargo_rustc/context.rs @@ -1,5 +1,6 @@ use std::collections::{HashMap, HashSet}; use std::str; +use semver::Version; use core::{SourceMap, Package, PackageId, PackageSet, Resolve, Target}; use util; @@ -127,7 +128,32 @@ impl<'a, 'b> Context<'a, 'b> { self.compilation.root_output = self.layout(KindTarget).proxy().dest().clone(); self.compilation.deps_output = self.layout(KindTarget).proxy().deps().clone(); - Ok(()) + let env = &mut self.compilation.extra_env; + env.insert("CARGO_PKG_VERSION_MAJOR".to_string(), + Some(pkg.get_version().major.to_string())); + env.insert("CARGO_PKG_VERSION_MINOR".to_string(), + Some(pkg.get_version().minor.to_string())); + env.insert("CARGO_PKG_VERSION_PATCH".to_string(), + Some(pkg.get_version().patch.to_string())); + env.insert("CARGO_PKG_VERSION_PRE".to_string(), + pre_version_component(pkg.get_version())); + + return Ok(()); + + fn pre_version_component(v: &Version) -> Option { + if v.pre.is_empty() { + return None; + } + + let mut ret = String::new(); + + for (i, x) in v.pre.iter().enumerate() { + if i != 0 { ret.push_char('.') }; + ret.push_str(x.to_string().as_slice()); + } + + Some(ret) + } } fn build_requirements(&mut self, pkg: &'a Package, target: &'a Target, diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs index bc1936177..40d443e3c 100644 --- a/src/cargo/ops/cargo_rustc/mod.rs +++ b/src/cargo/ops/cargo_rustc/mod.rs @@ -2,10 +2,8 @@ use std::collections::HashSet; use std::dynamic_lib::DynamicLibrary; use std::io::{fs, UserRWX}; use std::os; -use semver::Version; use core::{SourceMap, Package, PackageId, PackageSet, Target, Resolve}; -use util; use util::{CargoResult, ProcessBuilder, CargoError, human, caused_human}; use util::{Config, internal, ChainError, Fresh, profile}; @@ -433,26 +431,9 @@ pub fn process(cmd: T, pkg: &Package, cx: &Context) -> ProcessBuilder search_path.push(cx.layout(KindPlugin).deps().clone()); let search_path = os::join_paths(search_path.as_slice()).unwrap(); - util::process(cmd) - .cwd(pkg.get_root()) - .env(DynamicLibrary::envvar(), Some(search_path.as_slice())) - .env("CARGO_PKG_VERSION_MAJOR", Some(pkg.get_version().major.to_string())) - .env("CARGO_PKG_VERSION_MINOR", Some(pkg.get_version().minor.to_string())) - .env("CARGO_PKG_VERSION_PATCH", Some(pkg.get_version().patch.to_string())) - .env("CARGO_PKG_VERSION_PRE", pre_version_component(pkg.get_version())) -} - -fn pre_version_component(v: &Version) -> Option { - if v.pre.is_empty() { - return None; - } - - let mut ret = String::new(); - - for (i, x) in v.pre.iter().enumerate() { - if i != 0 { ret.push_char('.') }; - ret.push_str(x.to_string().as_slice()); - } - - Some(ret) + // We want to use the same environment and such as normal processes, but we + // want to override the dylib search path with the one we just calculated. + cx.compilation.process(cmd).cwd(pkg.get_root()) + .env(DynamicLibrary::envvar(), + Some(search_path.as_slice())) } diff --git a/src/snapshots.txt b/src/snapshots.txt index 318b9fecd..29dbc9b87 100644 --- a/src/snapshots.txt +++ b/src/snapshots.txt @@ -1,3 +1,10 @@ +2014-08-06 + linux-i386 eb7c2a87b30db077f6f1c4ea724ebd0e5cc07d1c + linux-x86_64 1672657adb9012df2912bbb2f43466f1c6817e55 + macos-i386 1224207bbfa9f46796940512ac8a7a9ab9f5665b + macos-x86_64 da4afea32d7336a0a91b8fe160d38896385d4ae2 + winnt-i386 2b6b2efe9ec77d3d456c943bb2e54f2281309ef1 + 2014-08-04 linux-i386 49032ce8c5c2b94d73e298dcbdb09e0b2fbe573c linux-x86_64 98c83ecc7cac3765d62f5e8b19bdc506e01f3cab diff --git a/tests/test_cargo_compile.rs b/tests/test_cargo_compile.rs index b9a3adfb9..aee2b4e60 100644 --- a/tests/test_cargo_compile.rs +++ b/tests/test_cargo_compile.rs @@ -787,16 +787,12 @@ test!(crate_version_env_vars { let p = project("foo") .file("Cargo.toml", r#" [project] - name = "foo" version = "0.5.1-alpha.1" authors = ["wycats@example.com"] - - [[bin]] - name = "foo" "#) - .file("src/foo.rs", r#" - use std::os; + .file("src/main.rs", r#" + extern crate foo; static VERSION_MAJOR: &'static str = env!("CARGO_PKG_VERSION_MAJOR"); static VERSION_MINOR: &'static str = env!("CARGO_PKG_VERSION_MINOR"); @@ -804,11 +800,19 @@ test!(crate_version_env_vars { static VERSION_PRE: &'static str = env!("CARGO_PKG_VERSION_PRE"); fn main() { - println!("{}-{}-{} @ {}", - VERSION_MAJOR, - VERSION_MINOR, - VERSION_PATCH, - VERSION_PRE); + let s = format!("{}-{}-{} @ {}", VERSION_MAJOR, VERSION_MINOR, + VERSION_PATCH, VERSION_PRE); + assert_eq!(s, foo::version()); + println!("{}", s); + } + "#) + .file("src/lib.rs", r#" + pub fn version() -> String { + format!("{}-{}-{} @ {}", + env!("CARGO_PKG_VERSION_MAJOR"), + env!("CARGO_PKG_VERSION_MINOR"), + env!("CARGO_PKG_VERSION_PATCH"), + env!("CARGO_PKG_VERSION_PRE")) } "#); @@ -817,6 +821,8 @@ test!(crate_version_env_vars { assert_that( process(p.bin("foo")), execs().with_stdout("0-5-1 @ alpha.1\n")); + + assert_that(p.process(cargo_dir().join("cargo-test")), execs().with_status(0)); }) test!(custom_build_in_dependency { -- 2.30.2